package models.common.entity;

import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.persistence.Entity;
import javax.persistence.Transient;

import play.db.jpa.Model;

import common.utils.StrUtil;

/**
 * 用户交易记录表
 * 
 * @description
 *
 * @author ChenZhipeng
 * @createDate 2015年12月19日
 */

@Entity
public class t_deal_user extends Model {
	
	/** 用户ID */
	public long user_id;

	/** 添加时间 */
	public Date time;

	/** 流水号 */
	public String order_no;
	
	/** 交易类型：1-收入；2-支出；3-冻结；4-解冻； */
	private int deal_type;
	
	public DealType getDeal_type() {
		DealType dt = DealType.getEnum(this.deal_type);
		
		return dt;
	}
	
	public void setDeal_type(DealType dealType){
		this.deal_type = dealType.code;
	}
	
	/** 科目： */
	private int operation_type;
	
	@Transient
	public String course;
	
	public String getCourse(){
		String dealType = OperationType.getEnum(this.operation_type).description;
		return dealType;
	}
	
	public OperationType getOperation_type() {
		OperationType dealType = OperationType.getEnum(this.operation_type);
		return dealType;
	}

	public void setOperation_type(OperationType operationType, Map<String, String> summaryParam) {
		this.deal_type = operationType.dealType.code;
		this.operation_type = operationType.code;
		this.summary = StrUtil.replaceByMap(operationType.value, summaryParam);
	}

	/** 交易金额 */
	public double amount;

	/** 可用余额 */
	public double balance;

	/** 冻结金额 */
	public double freeze;

	/** 备注 */
	public String summary;
	
	/**业务订单号*/
	public String serial_number;
	
	/**
	 * 交易类型枚举
	 *
	 * @description 
	 *
	 * @author huangyunsong
	 * @createDate 2016年1月6日
	 */
	public enum DealType {

		/** 收入 */
		INCOME(1, "收入"),
		
		/** 支出 */
		PAY(2, "支出"),
		
		/** 冻结 */
		FREEZE(3, "冻结"),
		
		/** 解冻 */
		UNFREEZE(4, "解冻"),
		
		/** 线下收入 */
		OFFLINE_INCOME(5, "线下收入"),
		
		/** 线下支出 */
		OFFLINE_PAY(6, "线下支出")
		
		;
		
		public int code;
		
		public String value;  
		
		private DealType(int code, String value) {
			this.code = code;
			this.value = value;
		}

		public static DealType getEnum(int code){
			DealType[] dts = DealType.values();
			for (DealType dt: dts) {
				if (dt.code == code) {

					return dt;
				}
			}
			
			return null;
		}
	}

	/**
	 * 操作类型枚举
	 * 
	 * @description 
	 *
	 * @author ChenZhipeng
	 * @createDate 2015年12月21日
	 */
	public enum OperationType{
		
		/** 
		 * 操作类型:账户直充[101]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获得账户直充充值金额
		 */
		RECHARGE(101, "账户直充",DealType.INCOME, "获得账户直充充值金额"),
		
		/** 
		 * 操作类型:闪电快充[102]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获得闪电快充充值金额
		 */
		RECHARGE_QUICK (102,"闪电快充", DealType.INCOME, "获得闪电快充充值金额"),
		
		/** 
		 * 操作类型:平台向融通人收款 [103]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支出bidNo融通项目融通融通手续费
		 * <br>备注参数说明：bidNo-融通项目编号
		 */
		RELEASE_BID(103,"融通交易服务费", DealType.PAY, "支出bidNo融通项目融通交易服务费"),
		
		/** 
		 * 操作类型:回款[104]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获得billInvestNo账单回款金额
		 * <br>备注参数说明：billInvestNo-投资账单编号
		 */
		RECEIVE(104,"账单回款", DealType.INCOME, "获得billInvestNo账单回款金额"),
		
		/** 
		 * 操作类型:逾期罚息-投资人收入[105]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获得billInvestNo账单逾期罚息
		 * <br>备注参数说明：billInvestNo-投资账单编号
		 */
		RECEIVE_OVERDUE_FINE(105, "投资收入",DealType.INCOME, "获得billInvestNo账单逾期罚息"),
		
		/** 
		 * 操作类型:奖励兑换[106]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获得conversion_type兑换金额
		 * <br>备注参数说明：conversion_type-兑换类型
		 */
		CONVERSION(106, "奖励兑换",DealType.INCOME, "获得conversion_type兑换金额"),
		
		/** 
		 * 操作类型:债权转让成功-转让人获取竞拍金额[107]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获得debt_no转让项目出价金额
		 * <br>备注参数说明：获得debt_no转让项目编号
		 */
		RECEIVE_AUCTION_AMOUNT(107,"债权转让收入", DealType.INCOME, "获得debt_no转让项目出价金额"),
		
		/** 
		 * 操作类型:提现退票[108]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获取提现退票金额
		 */
		WITHDRAW_REFUND(108,"提现退票", DealType.INCOME, "获得提现退票金额"),
		
		/** 
		 * 操作类型:提现手续费退票[109]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获得提现手续费退票
		 */
		WITHDRAW_FEE_REFUND(109, "提现手续退票",DealType.INCOME, "获得提现手续费退票"),

		/** 
		 * 操作类型:提现[201]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：扣除提现金额
		 */
		WITHDRAW(201, "提现支出",DealType.PAY, "扣除提现金额"),
		
		/** 
		 * 操作类型:提现手续费[202]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：扣除提现手续费
		 */
		WITHDRAW_FEE(202, "提现手续费",DealType.PAY, "扣除提现手续费"),
		
		/** 
		 * 操作类型:放款人投资付款[203]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付bidNo投资项目购买金额
		 * <br>备注参数说明：bidNo-融通项目编号
		 */
		RELEASE_INVEST(203,"放款人投资", DealType.PAY, "支付bidNo投资项目购买金额"),
		
		/** 2、支出（融通服务费）：支付bidNo融通项目融通服务费（支付J164融通项目融通服务费） */
		/** 
		 * 操作类型:扣除融通服务费[204]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付bidNo融通项目融通服务费
		 * <br>备注参数说明：bidNo-融通项目编号
		 */
		LOAN_SERVICE_FEE(204, "融通交易服务费",DealType.PAY, "支付bidNo融通项目融通交易服务费"),
		
		/** 
		 * 操作类型:还款[205]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付billNo账单还款金额
		 * <br>备注参数说明：billNo-融通账单编号
		 */
		REPAYMENT(205, "账单还款",DealType.PAY, "支付billNo账单还款金额"),
		
		/** 
		 * 操作类型:扣除放款管理服务费[206]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付billInvestNo账单投资服务费
		 * <br>备注参数说明：billInvestNo-投资账单编号
		 */
		INVEST_SERVICE_FEE(206,"放款管理服务费", DealType.PAY, "支付billInvestNo放款管理服务费"),
		
		/** 
		 * 操作类型:逾期罚息-融通人支出[207]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付billNo账单逾期罚息
		 * <br>备注参数说明：billNo-融通账单编号
		 */
		REPAYMENT_OVERDUE_FINE(207,"逾期罚息", DealType.PAY, "支付billNo账单逾期罚息"),
		
		/** 
		 * 操作类型:逾期还款[210]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付billNo账单逾期还款金额
		 * <br>备注参数说明：billNo-融通账单编号
		 */
		REPAYMENT_OVERDUE(210, "逾期还款",DealType.PAY, "支付billNo账单逾期还款金额"),
		
		
		/** 
		 * 操作类型:购买债权成功-转让人支付转让服务费[208]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付debt_no转让项目转让费用
		 * <br>备注参数说明：debt_no-转让项目编号
		 */
		REPAYMENT_TRANSFER_FEE(208, "转让服务费",DealType.PAY, "支付debt_no转让项目转让费用"),
		
		/** 
		 * 操作类型:竞拍成功-竞拍者支付竞拍金额[209]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付debt_no转让项目出价金额
		 * <br>备注参数说明：debt_no-转让项目编号
		 */
		REPAYMENT_TRANSFER_AMOUNT(209, "支付竞拍",DealType.PAY, "支付debt_no转让项目出价金额"),
		
		
		
		/** 
		 * 操作类型:投标[301]
		 * <br>交易类型：冻结[3]
		 * <br>备注模板：冻结bidNo投资项目购买金额
		 * <br>备注参数说明：bidNo-融通项目编号
		 */
		INVEST_FREEZE(301,"冻结投资", DealType.FREEZE, "冻结bidNo投资项目购买金额"),

		/** 
		 * 操作类型:冻结保证金[302]
		 * <br>交易类型：冻结[3]
		 * <br>备注模板：冻结bidNo融通项目融通保证金
		 * <br>备注参数说明：bidNo-融通项目编号
		 */
		BAIL_FREEZE(302,"保证金冻结", DealType.FREEZE, "冻结bidNo融通项目融通保证金"),
		
		/** 
		 * 操作类型:冻结提现[303]
		 * <br>交易类型：支出[3]
		 * <br>备注模板：冻结提现金额
		 */
		WITHDRAW_FREEZE(303,"冻结提现", DealType.FREEZE, "冻结提现金额"),
		
		/** 4、解冻（购买金额）：退还bidNo投资项目购买金额（退还J164投资项目购买金额） */
		/** 
		 * 操作类型:投标[401]
		 * <br>交易类型：解冻[4]
		 * <br>备注模板：退还bidNo投资项目购买金额
		 * <br>备注参数说明：bidNo-融通项目编号
		 */
		INVEST_UNFREEZE(401,"退还投资", DealType.UNFREEZE, "退还bidNo投资项目购买金额"),
		
		/** 4、解冻（放款,标的失败）：退还bidNo融通项目融通保证金（退还Q15融通项目融通保证金） */
		/** 
		 * 操作类型:解冻保证金[402]
		 * <br>交易类型：解冻[4]
		 * <br>备注模板：退还bidNo融通项目融通保证金
		 * <br>备注参数说明：bidNo-融通项目编号
		 */
		BAIL_UNFREEZE(402,"退还保证金", DealType.UNFREEZE, "退还bidNo融通项目融通保证金"),
		
		/** 
		 * 操作类型:解冻提现[403]
		 * <br>交易类型：解冻[4]
		 * <br>备注模板：解冻提现金额
		 */
		WITHDRAW_UNFREEZE(403, "解冻提现",DealType.UNFREEZE, "解冻提现金额"),
		
		
		/** 
		 * 操作类型:竞拍成功-竞拍者支付竞拍金额[404]
		 * <br>交易类型：支出[3]
		 * <br>备注模板：冻结debt_no转让项目出价金额
		 * <br>备注参数说明：debt_no-转让项目编号
		 */
		BIDDING_TRANSFER_FORZEN(404,"支付竞拍", DealType.FREEZE, "冻结debt_no转让项目出价金额"),
		/** 
		 * 操作类型:竞拍成功-竞拍者支付竞拍金额[405]
		 * <br>交易类型：支出[4]
		 * <br>备注模板：支解冻debt_no转让项目出价金额
		 * <br>备注参数说明：debt_no-转让项目编号
		 */
		BIDDING_TRANSFER_UNFORZEN(405,"支付竞拍", DealType.UNFREEZE, "解冻debt_no转让项目出价金额"),
		
		/** 4、解冻（商票到期托收资金解冻）：bill_code 商票到期 解冻资金 */
		/** 
		 * 操作类型:解冻商票到期资金[407]
		 * <br>交易类型：解冻[4]
		 * <br>备注模板：bill_code 商票到期 解冻资金
		 * <br>备注参数说明：bill_code-商票号码
		 */
		TICKET_AMOUNT_UNFREEZE(406, "资金解冻",DealType.UNFREEZE, "bill_code 商票到期 解冻资金"),
		
		/** 
		 * 操作类型:商票到期 收款[407]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：bill_code 商票到期 获得商票金额
		 * <br>备注参数说明：bill_code-商票凭证号码
		 */
		DUE_PAYMENT(407,"商票到期收款", DealType.INCOME, "bill_code 商票到期兑现 获得商票金额"),
		/** 
		 * 操作类型:还款[408]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：支付bill_code商票金额
		 * <br>备注参数说明：billNo-商票号
		 */
		EXPIRE_REIMBURSEMENT(408,"商票还款", DealType.PAY, "支付bill_code商票金额"),
		
		/** 4、解冻（商票到期 融通返还额度解冻）：bid_no项目 商票到期 融通返还 解冻资金 */
		/** 
		 * 操作类型:解冻商票到期资金[407]
		 * <br>交易类型：解冻[4]
		 * <br>备注模板：bid_no项目 商票到期 融通返还 解冻资金
		 * <br>备注参数说明：融通项目编号
		 */
		BID_AMOUNT_UNFREEZE(409, "资金解冻",DealType.UNFREEZE, "bid_no项目 商票到期 融通返还 解冻资金"),
		/** 4、解冻（商票到期 融通返还额度解冻）：bid_no项目 商票到期 融通返还 解冻资金 */
		/** 
		 * 操作类型:解冻商票到期资金[410]
		 * <br>交易类型：解冻[4]
		 * <br>备注模板：bid_no项目 商票到期 融通返还 解冻资金
		 * <br>备注参数说明：融通项目编号
		 */
		FREEZE_AMOUNT(410, "资金冻结",DealType.FREEZE, "bill_code 商票到期 融通返还 冻结使用额度资金"),
		
		/** 
		 * 操作类型:冻结票信额度管理费[411]
		 * <br>交易类型：冻结票信额度管理费[4]
		 * <br>备注模板：冻结转开账款凭证certificate_code票信额度受让管理费amount元
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_FEE(411, "票信额度受让管理费",DealType.FREEZE, "冻结转开账款凭证certificate_code票信额度受让管理费amount元"),
		/** 
		 * 操作类型:扣除票信额度管理费[412]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：扣除转开账款凭证certificate_code票信额度受让管理费amount元
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_FEE_PAY(412, "票信额度受让管理费",DealType.PAY, "扣除转开账款凭证certificate_code票信额度受让管理费amount元"),
		/** 
		 * 操作类型:收取票信额度管理费[413]
		 * <br>交易类型：收入[1]
		 * <br>备注模板 收取转开账款凭证certificate_code票信额度受让管理费amount元
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_FEE_INCOME(413, "票信额度受让管理费",DealType.INCOME, "收取转开账款凭证certificate_code票信额度受让管理费amount元"),
		/** 
		 * 操作类型:扣除票信额度管理费[414]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：扣除转开账款凭证certificate_code票信额度受让管理手续费
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_CHARGE(414, "票信额度受让管理费",DealType.PAY, "扣除转开账款凭证certificate_code票信额度受让管理手续费"),
		/** 
		 * 操作类型:解冻额度管理费[411]
		 * <br>交易类型：解冻[4]
		 * <br>备注模板  解冻转开账款凭证certificate_code票信额度受让管理费amount元
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_FEE_UNFREEZE(415, "票信额度受让管理费",DealType.UNFREEZE, "解冻转开账款凭证certificate_code票信额度受让管理费amount元"),
		/** 
		 * 操作类型:大数据智能分析报告购买费用[111]
		 * <br>交易类型：支出[1]
		 * <br>备注模板  购买费用 ：大数据智能分析报告购买费用amount
		 * <br>备注参数说明：费用金额
		 */
		FINANCIAL_ANALYSIS_REPORT(111, "大数据智能分析报告购买费用",DealType.PAY, "购买大数据智能分析报告的费用"),
		
		/** 
		 * 操作类型:上市公司数据分析报告购买费用[427]
		 * <br>交易类型：支出[1]
		 * <br>备注模板  购买费用 ：上市公司数据分析报告购买费用amount
		 * <br>备注参数说明：费用金额
		 */
		FINANCIAL_QUOTED_FEES(427, "上市公司数据分析报告购买费用",DealType.PAY, "上市公司数据分析报告购买费用"),
		
		/** 
		 * 操作类型:逾期罚息-投资人收入[105]
		 * <br>交易类型：收入[1]
		 * <br>备注模板：获得billInvestNo账单逾期罚息
		 * <br>备注参数说明：billInvestNo-投资账单编号
		 */
		RECEIVE_OVERDUE_FINE_ONE(112, "融通账款",DealType.INCOME, "获得billInvestNo的融通金额"),
		
		/** 
		 * 操作类型:冻结票信额度管理费[417]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：冻结授信申请流水certificate_code额度管理费amount
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_UNFEE_PAY_CREDIT(417, "票信额度管理费",DealType.FREEZE, "授信额度申请审核通过 ：冻结授信申请流水certificate_code票信额度管理费amount元"),
		
		/** 
		 * 操作类型:扣除票信额度管理费[416]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：扣除授信申请流水certificate_code额度管理费amount
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_FEE_PAY_CREDIT(416, "票信额度管理费",DealType.PAY, "授信额度申请审核通过 ：扣除授信申请流水certificate_code票信额度管理费amount元"),
		
		/** 
		** 
		 * 操作类型:解冻票信额度管理费[418]
		 * <br>交易类型：解冻[4]
		 * <br>备注模板：授信额度申请审核通过 ：收取授信申请流水certificate_code额度管理费amount
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_FETCH_PAY_CREDIT(418, "票信额度管理费",DealType.INCOME, "授信额度申请审核通过 ：收取授信申请流水certificate_code票信额度管理费amount元"),
		
		/** 
		 * 操作类型:扣除票信流转服务费[419]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：扣除授信申请流水certificate_code额度管理费amount
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_FETCH_PAY_PLAT_CREDIT(419, "票信流转服务费",DealType.PAY, "授信额度申请审核通过 ：扣除授信申请流水certificate_code票信流转服务费amount元"),
		
		/** 
		 * 操作类型:扣除票信流转服务费[426]
		 * <br>交易类型：支出[2]
		 * <br>备注模板："扣除转开账款凭证certificate_code票信流转服务费amount元"
		 * <br>备注参数说明：融通项目编号
		 */
		CUSTODIAN_PAY_PLAT_CREDIT(426, "票信流转受让服务费",DealType.PAY, "扣除转开账款凭证certificate_code票信流转受让服务费amount元"),
		
		/** 
		 * 操作类型:冻结票信流转服务费[424]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：冻结转开账款凭证certificate_code票信流转服务费amount元
		 * <br>备注参数说明：融通项目编号
		 */
		FREEZE_FETCH_PAY_PLAT_CREDIT(424, "票信流转受让服务费",DealType.FREEZE, "冻结转开账款凭证certificate_code票信流转受让服务费amount元"),
		
		/** 
		 * 操作类型:解冻票信流转服务费[425]
		 * <br>交易类型：支出[2]
		 * <br>备注模板：解冻转开账款凭证certificate_code票信流转服务费amount元
		 * <br>备注参数说明：融通项目编号
		 */
		UNFREEZE_FETCH_PAY_PLAT_CREDIT(425, "票信流转受让服务费",DealType.UNFREEZE, "解冻转开账款凭证certificate_code票信流转受让服务费amount元"),
		
		/** 
		 ** 
		 * 操作类型:放款人进行托收[420]
		 * <br>交易类型：线下收入[5]
		 * <br>备注模板：成功收回投资certificate_code投资费用amount元
		 * <br>备注参数说明：融通项目编号
		 */
		COLLECTION_PAY_CREDIT(420, "托收收款",DealType.INCOME, "托收：成功收回投资certificate_code投资费用amount元"),
//		COLLECTION_PAY_CREDIT(420, "托收收款",DealType.OFFLINE_INCOME, "托收：成功收回投资certificate_code投资费用amount元"),
		
		/** 
		 * 操作类型:融通人托收还款[421]
		 * <br>交易类型：线下支出[6]
		 * <br>备注模板：成功还款放款人投资certificate_code投资费用的amount元
		 * <br>备注参数说明：融通项目编号
		 */
		//COLLECTION_PAY_PLAT_CREDIT(421, "托收还款",DealType.OFFLINE_PAY, "托收：成功还款放款人投资certificate_code投资费用的amount元"),
		COLLECTION_PAY_PLAT_CREDIT(421, "托收还款",DealType.PAY, "托收：成功还款放款人投资certificate_code投资费用的amount元"),
		
		/** 
		 ** 
		 * 操作类型:凭证托收[422]
		 * <br>交易类型：收入[5]
		 * <br>备注模板：成功收到兑现数字凭证code投资费用amount元
		 * <br>备注参数说明：融通项目编号
		 */
		//COLLECTION_PAY_VOUCHER(422, "凭证托收",DealType.OFFLINE_INCOME, "收到兑现数字凭证code投资费用amount元"),
		COLLECTION_PAY_VOUCHER(422, "凭证托收",DealType.INCOME, "收到兑现数字凭证code投资费用amount元"),
		
		/** 
		 * 操作类型:凭证兑现[423]
		 * <br>交易类型：支出[6]
		 * <br>备注模板：划款兑现数字凭证code投资费用amount元
		 * <br>备注参数说明：融通项目编号
		 */
		//COLLECTION_PAY_PLAT_VOUCHER(423, "凭证兑现",DealType.OFFLINE_PAY, "划款兑现数字凭证code投资费用amount元"),
		COLLECTION_PAY_PLAT_VOUCHER(423, "凭证兑现",DealType.PAY, "划款兑现数字凭证code投资费用amount元"),
		
		;
		
		/** 充值类型：(包括 直充和闪电快充 ) */
		public static final List<Integer> RECHARGE_TYPE = Arrays.asList(
				RECHARGE.code, RECHARGE_QUICK.code); 
		

		public int code;
		
		/** 操作描述  */
		public String description;
		
		/** 交易类型code  */
		public DealType dealType;
		
		/** 备注模板 */
		public String value;
		
		private OperationType(int code, DealType dealType, String value) {
			this.code = code;
			this.dealType = dealType;
			this.value = value;
		}
		
		private OperationType(int code, String description, DealType dealType, String value) {
			this.code = code;
			this.description = description;
			this.dealType = dealType;
			this.value = value;
		}
		
		public static OperationType getEnum(int code){
			OperationType[] ots = OperationType.values();
			for (OperationType ot: ots) {
				if (ot.code == code) {

					return ot;
				}
			}
			
			return null;
		}
	}
	
}
